﻿// 14. sizeof运算、整型概念、整数的书写.cpp : 

/*
sizeof 运算符
sizeof 运算符用于求数据类型或变量占用的内存空间。
用于数据类型：sizeof(数据类型)
用于变量：sizeof(变量名) 或 sizeof 变量名
注意：
 在 32 位和 64 位操作系统中，同一种数据类型占用的内存空间可能不一样。
 字符串（string）不是 C++的基本数据类型，用 sizeof 求它占用内存的大小没有意义
*/

/*
#include <iostream>
using namespace std;

int main()
{
    //用于数据类型：sizeof(数据类型)
    // 用于变量：sizeof(变量名) 或 sizeof 变量名
    // C++常用的数据类型：整数（int）、浮点数（float 和 double）、字符（char）和布尔（bool）。
    cout << "sizeof(int) = " << sizeof(int) << endl;
    cout << "sizeof(char) = " << sizeof(char) << endl;
    cout << "sizeof(short) = " << sizeof(short) << endl;
    cout << "sizeof(float) = " << sizeof(float) << endl;
    cout << "sizeof(double) = " << sizeof(double) << endl;
    cout << "sizeof(bool) = " << sizeof(bool) << endl;
    cout << "sizeof(int*) = " << sizeof(int*) << endl;          //指针，4/8
}
*/

/*
整型的基本概念
C++用 int 关键字来声明整型变量（int 是 integer 的简写）。
在声明整型变量的时候，可以在 int 关键字之前加 signed、unsigned、short 和 long 四种修饰符。
signed：有符号的，可以表示正数和负数。
unsigned：无符号的，只能表示正数，例如超女的身高和体重等。
short：短的，取值范围小，占用内存少。
long：长的，取值范围大，占用内存多。
*/

/*
//     类型简写             类型全称              长度                 取值范围
        short               signed short int       2 字节               32768~32767
        unsigned short      unsigned short int     2 字节               0~65535
        int                 signed int             4 字节               2147483648~2147483647
        unsigned            unsigned int           4 字节               0~4294967295
        long                signed long int        8 字节               9223372036854775808~9223372036854775807
        unsigned long       unsigned long int      8 字节               0~18446744073709551615
*/

/*
注意：
整数的取值范围与计算机操作系统和 C++语言编译器有关，没有一个固定的数值，
我们可以根据它占用的内存大小来推断它的取值范围。

     计算机用最高位 1 位来表达符号（0-正数，1-负数），unsigned 修饰过的正整数不需要符号位，
     在表达正整数的时候比 signed 修饰的正整数取值大一倍。
   给整型变量赋值不能超出它的取值范围，否则能产生不可预后的后果。
   在实际开发中，为了防止超出取值范围，应该保证有足够的空间。
*/

//整数的书写

//整数默认是十进制，一个表示十进制的数字不需要任何特殊的格式。

/*
 1、二进制：0 1
二进制由 0 和 1 两个数字组成，书写时必须以 0b 或 0B（不区分大小写）开头。

以下是合法的二进制：
int a = 0b101;           // 换算成十进制为 5
int b = -0b110010;       // 换算成十进制为 -50
int c = 0B100001;        // 换算成十进制为 33

以下是非法的二进制：
int m = 101010;          // 无前缀 0B，相当于十进制
int n = 0B410;           // 4 不是有效的二进制数字

注意，C++标准并不支持上面的二进制写法，只是有些编译器自己进行了扩展，才支持二进制数字。
换句话说，并不是所有的编译器都支持二进制数字，只有一部分编译器支持，并且跟编译器的版本有关系。
*/


/*
2、八进制：0 1 2 3 4 5 6 7 
八进制由 0~7 八个数字组成，书写时必须以 0 开头（注意是数字 0，不是字母 o）。
以下是合法的八进制数：
int a = 015;            // 换算成十进制为 13
int b = -0101;          // 换算成十进制为 -65
int c = 0177777;        // 换算成十进制为 65535

以下是非法的八进制：
int m = 256;            // 无前缀 0，相当于十进制
int n = 03A2;           // A 不是有效的八进制数字

*/


/*
3、十六进制：0 1 2 3 4 5 6 7 8 9 a b c d e f
十六进制由数字 0~9、字母 A~F 或 a~f（不区分大小写）组成，书写时必须以 0x 或 0X（不区分大小写）开头。
以下是合法的十六进制：
int a = 0X2A;          // 换算成十进制为 42
int b = -0XA0;         // 换算成十进制为 -160
int c = 0xffff;        // 换算成十进制为 65535

以下是非法的十六进制：
int m = 5A;            // 没有前缀 0X，是一个无效数字
int n = 0X3H;          // H 不是有效的十六进制数字

*/


/*
4、需要注意的坑
在 C++中，不要在十进制数前面加 0，会被编译器当成八进制。
还有，不要随便删掉别人程序中整数前面的 0，它不是多余的。
*/

/*
 C++11 的 long long 类型
 在 VS 中，long 是 4 字节，32 位。                  - 2147483648~2147483647
 在 Linux 中，long 是 8 字节，64 位。               - 9223372036854775808~9223372036854775807
 C++11 标准增了 long long 类型的整数，至少 64 位，且至少与 long 一样长。
 在 VS 中，long long 是 8 字节，64 位。             - 9223372036854775808~9223372036854775807
 在 Linux 中，long 和 long long 类型都是 8 字节，64 位
*/
